package com.justnow.offer;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @author justnow
 * Created on 2020-09-07
 * Description
 */
public class Solution26 {



    /**
     * 方法一，使用二叉树的层次遍历的方法，每次将每层的最后一个元素添加到链表中
     *
     *
     * @param root
     * @return
     */
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> list=  new LinkedList<>();

        if (root == null)
            return list;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        while (!queue.isEmpty()) {
            int size = queue.size();
            //先获得该层的个数，然后再往队列中添加元素，当i == size - 1
            //说明就是该层的最后一个元素。
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
                if (i == size - 1) {
                    list.add(node.val);
                }

            }
        }

        return list;
    }

    /**
     * 方法二，使用 根节点 -> 右子节点 -> 左子节点 的顺序来遍历
     * 就可以保证每层都是最先访问最右边的节点的。
     * 同时，使用一个depth来表示当前的深度
     * @param root
     * @return
     */
    List<Integer> list = new LinkedList<>();
    public List<Integer> rightSideView2(TreeNode root) {
        dfs(root, 0);
        return list;
    }
    private void dfs(TreeNode root, int depth) {
        if (root == null) {
            return ;
        }
        //如果当前节点所在深度还没有出现在res里，说明在该深度下当前节点是第一个被访问的节点，因此将当前节点加入res中。
        if (depth == list.size()) {
            list.add(root.val);
        }
        depth++;
        dfs(root.right, depth);
        dfs(root.left, depth);
    }

    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(1);
        TreeNode node2 = new TreeNode(2);
        TreeNode node3 = new TreeNode(3);
        TreeNode node4 = new TreeNode(4);
        TreeNode node5 = new TreeNode(5);
        TreeNode node6 = new TreeNode(6);
        TreeNode node7 = new TreeNode(7);
        TreeNode node8 = new TreeNode(8);
        node1.left = node2;
        node1.right = node3;
        node2.left = node4;
        node2.right = node5;
        node3.left = node6;
        node3.right = node7;
        node4.left = node8;

        Solution26 solution26 = new Solution26();
        List<Integer> list = solution26.rightSideView2(node1);
        System.out.println(list);


    }

}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int x) {
        this.val = x;
    }
}
